你真的理解C语言中的 “ 数组 ” 吗?(初阶篇)

您所在的位置:网站首页 定义数组a[10]={0} 你真的理解C语言中的 “ 数组 ” 吗?(初阶篇)

你真的理解C语言中的 “ 数组 ” 吗?(初阶篇)

2024-07-10 18:21| 来源: 网络整理| 查看: 265

⭐ 前言

本文将介绍C语言中数组;

通过数组我们可以更方便地存储和访问这些元素。

另外,数组也可以和指针相结合,组成数组指针或者指针数组。(这是重点放在后面单独出一篇笔记)

本章将带大家重点了解:一维数组和二维数组。

Let’s get it!

文章目录 1. 数组简介🎃 顺序存储🎃 存储方式🎃 长度和容量🎃 数组的索引 2. 一维数组的创建和初始化🌳 数组的初始化🟠 字符数组的初始化 🌳 一维数组在内存中的存储🌳 一维数组的使用一维数组的数组名是什么 3. 二维数组🌳 二维数组的创建🌳 二维数组的初始化🌳 二维数组在内存中的存储🌳 二维数组的使用 4. 数组名的含义🌳 冒泡排序函数的设计 5. 结语

1. 数组简介

先来从整体上认识一下数组,然后再深入理解!

🎃 顺序存储

顺序存储结构,是指用一段地址连续的存储单元来依次存储数据。

如图所示,每个蓝色方块都对应了数组中的一个数据: img

数据有类型,例如:32位整型int、单精度浮点型float、双精度浮点型double、字符型char,64位整型long long、16位短整型short等等。

🎃 存储方式

在编程语言中,用一维数组来实现顺序存储结构;

在C语言中,把第一个数据元素存储到下标为 0 的位置中,把第 2 个数据元素存储到下标为 1 的位置中,以此类推。

C语言中,数组的定义如下:

int arr[7];

我们也可以将数组元素进行初始化,如下:

int arr[7] = {5, 2, 0, 1, 3, 1, 4};

img

由于编译器能够通过后面的初始化列表知道到底有多少个数据元素,所以中括号中的数字可以省略,如下:

int arr[] = {5, 2, 0, 1, 3, 1, 4};

当然,我们还可以定义一个大数组,但是只初始化其中几个元素:

int arr[15] = {5, 2, 0, 1, 3, 1, 4}; 🎃 长度和容量

数组的长度指的是数组当前有多少个元素,数组的容量指的是数组最大能够存放多少个元素。

如果数组元素大于最大能存储的范围,在程序上是不允许的,可能会产生意想不到的问题,实现上是需要规避的。 img

如上图所示,数组的长度为 5,即红色部分;容量为 8,即红色 加 蓝色部分。

例如下面这个数组:

int arr[8] = {9, 8, 7, 6, 5}; 🎃 数组的索引

数组中的元素索引,我们可以采用[]运算符来完成,例如:

int a[7] = {5, 2, 0, 1, 3, 1, 4}; int b = a[0]; // 5 int c = a[6]; // 4 int d = a[7]; // error

这段代码中,a[0]表示的是数组的第一个元素,a[6]表示的数组的最后一个元素。

而a[7]则是非法的,原因是数组元素一个 7 个,而这个调用,索引到了第 8 个元素,如果程序这样调用,就可能引起位置的错误。

这种错误调用,我们一般称它为:数组下标越界。

以上简介出自英雄哥的《LeetCode零基础指南》 一维数组

接下来正式进入数组的学习!

2. 一维数组的创建和初始化

数组的创建方式:

type_t arr_name[const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小

例如:

int arr1[5]; char arr2[10]; float arr3[8]; double arr4[20];

以上这种创建形式都符合数组的创建语法。

🐱‍🏍注:数组创建,[ ]中要给一个常量才可以,不能使用变量。

例如:

int main() { int i = 20; int arr[i]; return 0; }

运行结果: image-20211125162451838

🌳 数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。

如果实在想不到赋什么初值,可以在初始化的时候直接赋值为0;

代码示例:

int main() { int arr1[5] = { 1,2,3,4,5 }; int arr2[5] = { 0 };//如果只传一个0,会将数组的内容全部初始化为0 char arr3[3] = { 'a',98, 'c' };//char变量直接存放数字,放的是数字所对应的ASCII码字符 char arr4[3] = { 0 };//将数组中的内容初始化为'\0',注意,这里不是字符0 return 0; }

🐱‍👓我们通过调试看一看: image-20211125163026046 如果数组不完全初始化,那么数组剩下的内容将会被自动初始化为0,char类型的自动初始化为\0

代码示例:

int main() { int arr1[10] = { 1,2,3,4,5 }; char arr2[10] = { 'a',98, 'c' }; return 0; }

调式结果: image-20211125163407137 数组在创建的时候如果想不指定数组的确定的大小就必须初始化。

数组的元素个数根据初始化的内容来确定。

📄代码示例:

int main() { int arr1[] = { 1,2,3,4,5 }; char arr2[] = { 'a','b','c' }; char arr3[] = "abc"; return 0; }

调试结果: image-20211125163930532 上面的代码中,arr1数组并没有指定大小,因此在初始化中将自动为其分配5个int大小的空间;

同理arr2和arr3也一样,但是arr2和arr3大小并不相同。

这就涉及到字符数组的初始化问题了。

🟠 字符数组的初始化

当我们想要给一个字符数组初始化时,可以用{ ' ', ' '}这样的形式将每个字符单独存放;

也可以用" "的形式直接存放一个字符串。

这两种类型是有区别的:

int main() { char arr1[] = { 'a','b','c' }; char arr2[] = "abc"; return 0; }

调试结果: image-20211125164317601 从监视中可以看出来,直接存放一个字符串的形式实际上就是将字符串的每个字符单独存放在字符数组中;

但是存放字符串要比单独存放字符在结束时多存放一个\0,这就导致存放字符串的空间大小比直接存放字符多1

关于字符数组和字符串数组的区别可以看我之前写过的一篇博客:深入理解字符数组和字符串数组

🌳 一维数组在内存中的存储

一维数组元素在内存中是连续存放的,随着数组下标的增长,地址由低到高变化;

我们通过 &(取地址符号) 来得到每个数组的地址

代码示例:

int main() { int arr[10] = { 0 }; int i = 0; for (i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3